package databasetest;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import oracle.net.aso.e;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Select extends JInternalFrame {
	/*
	 * ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ5/24일(토)수업목표
		*select class
		    - 행을 선택하면 Update.class 에 표시되도록 조치.
		    - sql 문장을 실행하면 그 결과를 테이블에 표시하도록 조치.
		    - Update, Insert에서 데이터가 수정되거나 추가되면 내용자동갱신.
		*Update.class 
		    -serial로 데이터를 검색한 후 내용을 수정하면 Select에 표시된 내용도
		     갱신 되도록 조치.
		    - 삭제버튼 추가 및 관련내용 작성(데어티가 삭제되면 Select에 표시된 내용도 삭제)
		*Insert.class
		    - 데이터가 추가되면 Select에 표시된 내용도 갱신되도록 조치.
    
	 * ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	 * 
	 */
	
	Connection conn;
	private JPanel panel;
	private JTextField sql;
	private JButton btnSelect;
	private JScrollPane scrollPane;
	private JTable table;
	private JLabel status;
	
	DatabaseTest main;	
	DefaultTableModel model;

	/**
	 * Launch the application.
	 */
//	public static void main(String[] args) {
//		EventQueue.invokeLater(new Runnable() {
//			public void run() {
//				try {
//					Select frame = new Select();
//					frame.setVisible(true);
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		});
//	}

	/**
	 * Create the frame.
	 */
	public Select(Connection c, DatabaseTest m) {
		super("조회", true, true, true, false);
		setBounds(300, 400, 346, 350);
		
		this.conn = c;
		getContentPane().setLayout(new BorderLayout(0, 0));
		getContentPane().add(getPanel(), BorderLayout.NORTH);
		getContentPane().add(getScrollPane(), BorderLayout.CENTER);
		getContentPane().add(getStatus(), BorderLayout.SOUTH);
		
		this.main = m;

	}
	
	public void setList(){  //쿼리실행을 누르면 실행됨
		String s = sql.getText();
		try {			
		 
			PreparedStatement pstmt = conn.prepareStatement(s);
			ResultSet rs = pstmt.executeQuery();
			ResultSetMetaData rsm = rs.getMetaData(); //rs에 대한 컬럼정보얻어오는 명령어.
			
			Vector v = new Vector();	//컬럼값 셋팅하는 절차임.. 외우기~!! 
			v.add("NO");  //no컬럼을 하나 추가.
			for(int i=1; i<=rsm.getColumnCount();i++){  //1번째컬럼부터 컬럼네임 셋팅.
				v.add(rsm.getColumnName(i));				
			}
			model = new DefaultTableModel(v,0); //모델의 0행에 v값을 셋팅.
			table.setModel(model);
			
			int cnt = 1;
			
			while(rs.next()){
				Vector d = new Vector();
				d.add(cnt);
				for(int i=1; i<=rsm.getColumnCount(); i++){
					d.add(rs.getString(i));
				}
				model.addRow(d);
				cnt++;
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}		
	}
	
	
	
	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
			panel.add(getTextField_1());
			panel.add(getBtnSelect());
		}
		return panel;
	}
	private JTextField getTextField_1() {
		if (sql == null) {
			sql = new JTextField();
			sql.setColumns(10);
		}
		return sql;
	}
	private JButton getBtnSelect() {
		if (btnSelect == null) {
			btnSelect = new JButton("쿼리실행");
			btnSelect.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {				
					setList();
					
				}
			});
		}
		return btnSelect;
	}
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setViewportView(getTable());
		}
		return scrollPane;
	}
	private JTable getTable() {
		if (table == null) {
			table = new JTable();
			table.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent ev) {
					if(main.update == null){
						main.openUpdate();  //main에 있는 openUpdate()호출.
					}
					
					int row = table.getSelectedRow();
					String s = (String)table.getValueAt(row, 1); //1번째 컬럼의 값을 얻어옴.
					String c = (String)table.getValueAt(row, 2);
					String e = (String)table.getValueAt(row, 3);
					
					main.update.setData(s, c, e);
					main.update.setVisible(true);
					main.update.toFront();
				
				}
			});
		
		}
		return table;
	}
	private JLabel getStatus() {
		if (status == null) {
			status = new JLabel("New label");
		}
		return status;
	}
}
